/**
 * @ProjectName: 
 * @Copyright: 2014 lisheng  All Right Reserved.
 * @address: toughheart@163.com
 * @date: 2015年11月26日 下午7:53:24
 * @Description: 本内容未经本人允许禁止使用、转发.
 */

package com.ls.fw.mvc.springmvc.util;

import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSON;
import com.ls.fw.mvc.springmvc.base.BaseController;
import com.ls.fw.mvc.springmvc.support.jsonp.handler.JsonCallbackCheck;
import com.ls.fw.mvc.springmvc.support.view.json.JsonView;

/**
 * 
 * @author lisheng
 * @date 2015年11月26日 下午7:53:24
 * @version V1.0
 */
public class ViewUtil {

	/**
	 * 根据不同请求类型返回不同结果.(ajax请求默认返回json)
	 * 
	 * @author lisheng
	 * @date 2015年4月20日 下午8:06:35
	 * @version V1.0
	 * @param mav
	 * @param webRequest
	 * @param excludeKeys
	 *            不显示的属性
	 * @return
	 */
	public static ModelAndView convert(ModelAndView mav, WebRequest webRequest,
			String... excludeKeys) {
		return convert(mav, webRequest, false, excludeKeys);
	}

	/**
	 * 根据不同请求类型返回不同结果.(ajax请求默认返回json)
	 * 
	 * @author lisheng
	 * @date 2016年2月10日 下午8:47:24
	 * @version V1.0
	 * @param mav
	 * @param webRequest
	 * @param sureJson
	 * @param excludeKeys
	 *            不显示的属性
	 * @return
	 */
	public static ModelAndView convert(ModelAndView mav, WebRequest webRequest,
			boolean sureJson, String... excludeKeys) {
		if (isReturnJson(webRequest, sureJson)) {
			JsonView json = new JsonView();
			json.setExcludeKeys(excludeKeys);
			mav.setView(json);
		}
		return mav;
	}

	/**
	 * 根据不同请求类型返回不同结果.(ajax请求默认返回json)
	 * 
	 * @author lisheng
	 * @date 2016年2月10日 下午8:47:04
	 * @version V1.0
	 * @param mav
	 * @param webRequest
	 * @param modelKeys
	 *            显示的属性
	 * @return
	 */
	public static ModelAndView convert(final ModelAndView mav,
			final WebRequest webRequest, final Set<String> modelKeys) {
		return convert(mav, webRequest, false, modelKeys, null);
	}

	/**
	 * 根据不同请求类型返回不同结果.(ajax请求默认返回json)
	 * 
	 * @author lisheng
	 * @date 2016年2月10日 下午8:46:58
	 * @version V1.0
	 * @param mav
	 * @param webRequest
	 * @param sureJson
	 * @param modelKeys
	 *            显示的属性
	 * @return
	 */
	public static ModelAndView convert(final ModelAndView mav,
			final WebRequest webRequest, final boolean sureJson,
			final Set<String> modelKeys) {
		return convert(mav, webRequest, sureJson, modelKeys, null);
	}

	/**
	 * 根据不同请求类型返回不同结果.(ajax请求默认返回json)
	 * 
	 * @author lisheng
	 * @date 2016年2月10日 下午8:46:50
	 * @version V1.0
	 * @param mav
	 * @param webRequest
	 * @param modelKeys
	 *            显示的属性
	 * @param excludeKeys
	 *            不显示的属性
	 * @return
	 */
	public static ModelAndView convert(final ModelAndView mav,
			final WebRequest webRequest, final Set<String> modelKeys,
			final Set<String> excludeKeys) {
		return convert(mav, webRequest, false, modelKeys, excludeKeys);

	}

	/**
	 * 根据不同请求类型返回不同结果.(ajax请求默认返回json)
	 * 
	 * @author lisheng
	 * @date 2016年2月10日 下午8:46:22
	 * @version V1.0
	 * @param mav
	 * @param webRequest
	 * @param sureJson
	 * @param modelKeys
	 *            显示的属性
	 * @param excludeKeys
	 *            不显示的属性
	 * @return
	 */
	public static ModelAndView convert(final ModelAndView mav,
			final WebRequest webRequest, final boolean sureJson,
			final Set<String> modelKeys, final Set<String> excludeKeys) {
		if (isReturnJson(webRequest, sureJson)) {
			JsonView json = new JsonView();
			json.setExcludeKeys(excludeKeys);
			json.setModelKeys(modelKeys);
			mav.setView(json);
		}
		return mav;
	}

	/**
	 * 是否返回json
	 * 
	 * @author lisheng
	 * @date 2015年12月21日 下午9:45:41
	 * @version V1.0
	 * @param webRequest
	 * @param forceJson
	 *            是否强制要求返回json
	 * @return
	 */
	public static boolean isReturnJson(WebRequest webRequest, boolean forceJson) {
		boolean force = false // 经过参数设置是否强制
		, isJson = false;// 是否是json
		String json = webRequest.getParameter(BaseController.JSON_FLAG);
		if ("1".equalsIgnoreCase(json) || "true".equalsIgnoreCase(json)) {
			force = true;
			isJson = true;
		} else if ("0".equalsIgnoreCase(json) || "false".equalsIgnoreCase(json)) {
			force = true;
			isJson = false;
		}
		boolean reJson = false;
		if (force) {
			if (forceJson || isJson) {
				reJson = true;
			}
		} else {
			if (forceJson || AjaxUtils.isAjaxRequest(webRequest)) {
				reJson = true;
			}
		}
		return reJson;
	}

	/**
	 * 是否返回json
	 * 
	 * @author lisheng
	 * @date 2015年12月21日 下午9:45:41
	 * @version V1.0
	 * @param webRequest
	 * @param forceJson
	 *            是否强制要求返回json
	 * @return
	 */
	public static boolean isReturnJson(HttpServletRequest webRequest,
			boolean forceJson) {
		boolean force = false // 经过参数设置是否强制
		, isJson = false;// 是否是json
		String json = webRequest.getParameter(BaseController.JSON_FLAG);
		if ("1".equalsIgnoreCase(json) || "true".equalsIgnoreCase(json)) {
			force = true;
			isJson = true;
		} else if ("0".equalsIgnoreCase(json) || "false".equalsIgnoreCase(json)) {
			force = true;
			isJson = false;
		}
		boolean reJson = false;
		if (force) {
			if (forceJson || isJson) {
				reJson = true;
			}
		} else {
			if (forceJson || AjaxUtils.isAjaxRequest(webRequest)) {
				reJson = true;
			}
		}
		return reJson;
	}

	/**
	 * 根据不同请求类型返回不同结果.(ajax请求返回json)
	 * 
	 * @author lisheng
	 * @date 2015年11月26日 下午9:11:17
	 * @version V1.0
	 * @param mav
	 * @param webRequest
	 * @param sureJson
	 * @param enableJsonp
	 * @param callback
	 *            回调函数jsonCallback
	 * @return
	 */
	public static ModelAndView convert(ModelAndView mav,
			HttpServletRequest webRequest, boolean sureJson,
			boolean enableJsonp, JsonCallbackCheck callback) {
		String jsonCallback = "";
		if (enableJsonp) {
			jsonCallback = webRequest
					.getParameter(BaseController.CALLBACK_PARA);
			if (callback == null || !callback.valid(webRequest, jsonCallback)) {
				jsonCallback = "";
			}
		}
		if (isReturnJson(webRequest, sureJson)) {
			JsonView json = new JsonView();
			mav.setView(json);
		}
		if (StringUtils.isNotBlank(jsonCallback)) {
			Map<String, Object> map = mav.getModel();
			mav.addObject(jsonCallback + "(" + JSON.toJSONString(map) + ")");
			map.clear();
		}
		return mav;
	}

	
	/**
	 * 是否返回json
	 * 
	 * @author lisheng
	 * @date 2016年3月11日 下午8:32:37
	 * @version V1.0
	 * @param handlerMethod
	 * @return
	 */
	public static boolean isResponseBody(HandlerMethod handlerMethod) {
		boolean ok = false;
		Object body = null;
		if (handlerMethod != null) {
			body = handlerMethod.getMethodAnnotation(ResponseBody.class);
			if (body == null) {
				body = handlerMethod.getBeanType().getAnnotation(
						ResponseBody.class);
			}
			if (body == null) {
				body = handlerMethod.getBeanType().getAnnotation(
						RestController.class);
			}
		}
		if (body != null) {
			ok = true;
		}
		return ok;
	}
}
